package br.edu.univas.jobmanager.view;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;

import br.edu.univas.jobmanager.entity.Categoria;
import br.edu.univas.jobmanager.entity.Estado;
import br.edu.univas.jobmanager.entity.Tarefa;
import br.edu.univas.jobmanager.utilitarios.Utilitarios;

public class HistoricoDeTarefasTableModel extends AbstractTableModel {
	private static final long serialVersionUID = 1L;
	
	
	private ArrayList<Tarefa> tarefas = new ArrayList<Tarefa>();
	private String[] colunas = {"ID","Nome","Categoria","Status","Inicio","Fim"};

	public HistoricoDeTarefasTableModel(ArrayList<Tarefa> tarefas) {
		this.tarefas = tarefas;
	}
	
	@Override
	public int getColumnCount() {
		return colunas.length;
	}
	@Override
	public String getColumnName(int i) {
		return colunas[i];
	}
	@Override
	public int getRowCount() {
		return tarefas.size();
	}

	@Override
	public Object getValueAt(int row, int col) {
		Tarefa tarefa = tarefas.get(row);
		
		switch (col) {
		case 0:
			return tarefa.getIdTask();
		case 1:
			return tarefa.getNome();
		case 2:
			return tarefa.getCategoria().getNome();
		case 3:
			return tarefa.getEstado().getTipo();
		case 4:
			try{
				return Utilitarios.converteHora(tarefa.getHoraInicio());
			}catch (Exception e) {
				JOptionPane.showMessageDialog(null, "Erro ao converter a data da tarefa" + tarefa.getNome());
				return "ERRO";
			}
		case 5:
			try{
				return Utilitarios.converteHora(tarefa.getHoraFim());
			}catch (Exception e) {
				JOptionPane.showMessageDialog(null, "Erro ao converter a data da tarefa" + tarefa.getNome());
				return "ERRO";
			}
		}
		return tarefa;
	}
	public void filtrarPorCategoria(Categoria categoria){
		@SuppressWarnings("unused")
		int contador = 0;
		ArrayList<Tarefa> novo = new ArrayList<Tarefa>();
		for (Tarefa tarefa : tarefas) {
			if(tarefa.getCategoria().getIdCategoria() == categoria.getIdCategoria()){
				novo.add(tarefa);
			}
		}
		tarefas = novo;
		fireTableDataChanged();
	}
	public void filtrarPorEstado(Estado estado){
		ArrayList<Tarefa> novo = new ArrayList<Tarefa>();
		for (Tarefa tarefa : tarefas) {
			if(tarefa.getEstado().getIdEstado() == estado.getIdEstado()){
				novo.add(tarefa);
			}
			
		}
		tarefas = novo;
		fireTableDataChanged();
	}
	public String getDataFormatada(Date data){
		SimpleDateFormat sdf = new SimpleDateFormat(Utilitarios.DATE_FORMAT);
		return sdf.format(data);
	}
	public void atualizarTabela(ArrayList<Tarefa> tarefas){
		this.tarefas = tarefas;
		fireTableDataChanged();
	}
	public void filtrarPorPeriodo(Date dataInicial, Date dataFinal){
		ArrayList<Tarefa> novo = new ArrayList<Tarefa>();
		for (Tarefa tarefa : tarefas) {
			if(tarefa.getHoraFim().after(dataInicial) && tarefa.getHoraInicio().before(dataFinal)){
				novo.add(tarefa);
			}
		}
		tarefas = novo;
		fireTableDataChanged();
	}
	
	public void filtraPorNome(String nome){
		ArrayList<Tarefa> novo = new ArrayList<Tarefa>();
		for (Tarefa tarefa : tarefas) {
			if(tarefa.getNome().toLowerCase().contains(nome.toLowerCase())){
				novo.add(tarefa);
			}
		}
		tarefas = novo;
		fireTableDataChanged();
	}

	public Tarefa getItem(Integer linha) {
		return tarefas.get(linha);
		
	}
}
